package utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * md5
 * @author cuidianlong
 * 2017-05-20
 */
public class MD5Util {
	/**
      * 获取MD5加密
      * 
      * @param pwd
      *            需要加密的字符串
      * @return String字符串 加密后的字符串
      */
     public static String getPwd(String pwd) {
         try {
             // 创建加密对象
             MessageDigest digest = MessageDigest.getInstance("md5");
 
             // 调用加密对象的方法，加密的动作已经完成
             byte[] bs = digest.digest(pwd.getBytes());
             // 接下来，我们要对加密后的结果，进行优化，按照mysql的优化思路走
             // mysql的优化思路：
             // 第一步，将数据全部转换成正数：
             String hexString = "";
             for (byte b : bs) {
                 // 第一步，将数据全部转换成正数：
                 // 解释：为什么采用b&255
                 /*
                  * b:它本来是一个byte类型的数据(1个字节) 255：是一个int类型的数据(4个字节)
                  * byte类型的数据与int类型的数据进行运算，会自动类型提升为int类型 eg: b: 1001 1100(原始数据)
                  * 运算时： b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000
                  * 0000 0000 0000 0000 0000 1111 1111 结果：0000 0000 0000 0000
                  * 0000 0000 1001 1100 此时的temp是一个int类型的整数
                  */
                 int temp = b & 255;
                 // 第二步，将所有的数据转换成16进制的形式
                 // 注意：转换的时候注意if正数>=0&&<16，那么如果使用Integer.toHexString()，可能会造成缺少位数
                 // 因此，需要对temp进行判断
                 if (temp < 16 && temp >= 0) {
                     // 手动补上一个“0”
                     hexString = hexString + "0" + Integer.toHexString(temp);
                 } else {
                     hexString = hexString + Integer.toHexString(temp);
                 }
             }
             return hexString;
         } catch (NoSuchAlgorithmException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return "";
     }
 
     /**
      * @param args
      */
     public static void main(String[] args) {
         String pwd = MD5Util.getPwd("abc");
         System.out.println(pwd);
     }
}
